import {_decorator, Component,Animation} from 'cc';
import {BulletViewModel} from "db://assets/Scripts/MVC/Bullet/BulletViewModel";
import {BulletUiState} from "db://assets/Scripts/MVC/Bullet/BulletUiState";
import {BulletType} from "db://assets/Scripts/MVC/Bullet/BulletType";
import {PoolManager} from "db://assets/Scripts/framework/PoolManager";

const {ccclass, property} = _decorator;

/**
 * 子弹控制器
 * 挂载在每个子弹身上，无需考虑创建，只需考虑碰撞和销毁
 *
 * 第一步：贴图（子弹）
 * 第二步：材质（builtin-unlit）Technique：【不透明选0，透明选1或3，3比1好】
 * 第三步：制作预制体：新建空节点（命名为Bullet）-找一个3D模型（命名为Body）调整位置、旋转、缩放-挂载脚本-拖入文件夹生产预制体
 */
@ccclass('BulletController')
export class BulletController extends Component {
    /**
     * 子弹ViewModel
     */
    public viewModel: BulletViewModel = new BulletViewModel();
    /**
     * 子弹UIState
     */
    public uiState: BulletUiState = this.viewModel.uiState;

    start() {
        
    }

    update(deltaTime: number) {
        // 移动子弹
        this.move(deltaTime);
        // 销毁子弹
        this.remove();
    }

    /**
     * 移动子弹
     */
    private move(deltaTime: number) {
        // 获取位置
        const position = this.node.position;
        // 设置子弹位置
        this.node.setPosition(position.x + this.uiState.direction.x * this.uiState.speed.x * deltaTime,
            position.y + this.uiState.direction.y * this.uiState.speed.y * deltaTime,
            position.z + this.uiState.direction.z * this.uiState.speed.z * deltaTime);
    }

    /**
     * 销毁子弹
     */
    private remove() {
        // 当间距超过最大范围时
        if (this.node.position.z < this.uiState.outRange) {
            // 回收节点
            this.recycle();
        }
    }

    /**
     * 回收节点
     */
    private recycle(){
        // 回收节点
        PoolManager.getInstance().putNode(this.node);
        // 重置ViewModel
        this.viewModel.reset();
    }
}